// **************************************************************
// COPYRIGHT(c)2015, Xidian University
// All rights reserved.
//
// IP LIB INDEX :  
// IP Name      :      
// File name    :  
// Module name  :  
// Full name    :  
// Time         : 2016.10.19
// Author       : wangweina
// Email        : 327422289@qq.com
// Data         : 
// Version      : V 1.0 
// 
// Abstract     :
// Called by    :  bv模块中的真双口RAM
// 
// Modification history
// -----------------------------------------------------------------
// 双口RAM可以同时处理两个规则
// 
//
// *****************************************************************

// *******************
// TIMESCALE
// ******************* 
`timescale 1ns/1ps 

// *******************
// INFORMATION
// *******************

//*******************
//DEFINE(s)
//*******************
//`define UDLY 1    //Unit delay, for non-blocking assignments in sequential logic

//*******************
//DEFINE MODULE PORT
//*******************
module  dual_ram
    #(parameter WIDTH   = 8, 
      parameter DEPTH   = 16,
      parameter ADD_W   = 4, 
      parameter RUL_N   = 3, 
      parameter RAM_NUM = 1  
    )
    (
        //inputs
        input wire clk,
        // input wire lookup_en1,
        input wire rst_n,
        input wire modify_en,
        input wire[ADD_W-1:0] addr1,

        //modify
        input wire[RUL_N-1:0] modify_loc,
        input wire[DEPTH-1:0] modify_value,
        output reg[DEPTH-1:0] dout2,
        //outputs
        output reg[WIDTH-1:0] dout1
    );

//*******************
//DEFINE LOCAL PARAMETER
//*******************
//parameter(s)

             
                                    

 

//*********************
//INNER SIGNAL DECLARATION
//*********************
//REGS
    
reg[WIDTH-1:0] ram [DEPTH-1:0];  
//WIRES
 

//*********************
//INSTANTCE MODULE
//*********************

reg[4:0] i;
 


//*********************
//MAIN CORE
//********************* 

always @(posedge clk or negedge rst_n)
 begin
    if(~rst_n)
      for ( i = 0; i < DEPTH ; i = i + 1 )
        ram[i] <= 0;
    else if (modify_en) 
    begin
        {ram[ 0][WIDTH-1 - modify_loc],ram[ 1][WIDTH-1 - modify_loc],ram[ 2][WIDTH-1 - modify_loc],ram[ 3][WIDTH-1 - modify_loc],
         ram[ 4][WIDTH-1 - modify_loc],ram[ 5][WIDTH-1 - modify_loc],ram[ 6][WIDTH-1 - modify_loc],ram[ 7][WIDTH-1 - modify_loc],
         ram[ 8][WIDTH-1 - modify_loc],ram[ 9][WIDTH-1 - modify_loc],ram[10][WIDTH-1 - modify_loc],ram[11][WIDTH-1 - modify_loc],
         ram[12][WIDTH-1 - modify_loc],ram[13][WIDTH-1 - modify_loc],ram[14][WIDTH-1 - modify_loc],ram[15][WIDTH-1 - modify_loc]
        } <= modify_value;

    end
    else 
      begin
        {ram[ 0][WIDTH-1 - modify_loc],ram[ 1][WIDTH-1 - modify_loc],ram[ 2][WIDTH-1 - modify_loc],ram[ 3][WIDTH-1 - modify_loc],
         ram[ 4][WIDTH-1 - modify_loc],ram[ 5][WIDTH-1 - modify_loc],ram[ 6][WIDTH-1 - modify_loc],ram[ 7][WIDTH-1 - modify_loc],
         ram[ 8][WIDTH-1 - modify_loc],ram[ 9][WIDTH-1 - modify_loc],ram[10][WIDTH-1 - modify_loc],ram[11][WIDTH-1 - modify_loc],
         ram[12][WIDTH-1 - modify_loc],ram[13][WIDTH-1 - modify_loc],ram[14][WIDTH-1 - modify_loc],ram[15][WIDTH-1 - modify_loc]
        } <=
        {ram[ 0][WIDTH-1 - modify_loc],ram[ 1][WIDTH-1 - modify_loc],ram[ 2][WIDTH-1 - modify_loc],ram[ 3][WIDTH-1 - modify_loc],
         ram[ 4][WIDTH-1 - modify_loc],ram[ 5][WIDTH-1 - modify_loc],ram[ 6][WIDTH-1 - modify_loc],ram[ 7][WIDTH-1 - modify_loc],
         ram[ 8][WIDTH-1 - modify_loc],ram[ 9][WIDTH-1 - modify_loc],ram[10][WIDTH-1 - modify_loc],ram[11][WIDTH-1 - modify_loc],
         ram[12][WIDTH-1 - modify_loc],ram[13][WIDTH-1 - modify_loc],ram[14][WIDTH-1 - modify_loc],ram[15][WIDTH-1 - modify_loc]
        };

      end
end


always@(*)
  begin  
        dout1 =ram[addr1];
  end

always@(*)
  begin
        dout2 = {ram[ 0][WIDTH-1 - modify_loc],ram[ 1][WIDTH-1 - modify_loc],ram[ 2][WIDTH-1 - modify_loc],ram[ 3][WIDTH-1 - modify_loc],
               ram[ 4][WIDTH-1 - modify_loc],ram[ 5][WIDTH-1 - modify_loc],ram[ 6][WIDTH-1 - modify_loc],ram[ 7][WIDTH-1 - modify_loc],
               ram[ 8][WIDTH-1 - modify_loc],ram[ 9][WIDTH-1 - modify_loc],ram[10][WIDTH-1 - modify_loc],ram[11][WIDTH-1 - modify_loc],
               ram[12][WIDTH-1 - modify_loc],ram[13][WIDTH-1 - modify_loc],ram[14][WIDTH-1 - modify_loc],ram[15][WIDTH-1 - modify_loc]
              };
  end
// assign dout1 = (lookup_en1)?ram[addr1]:8'b0;
// assign dout2 = (lookup_en2)?ram[addr2]:8'b0;
//*********************
endmodule    // hookup byte controller block
